iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0

前言
以前對於例外處理直覺就是在方法內包 try ~ catch ~ ,後來對於每一個方法都這樣做開始有點疲乏 /images/emoticon/emoticon28.gif

到後來,開始會使用 Filter、中介等等去捕捉,但還是有一些誤解!

今天來分享所學習到對於例外處理的筆記與觀念 ~

分享主軸

  • 例外處裡
  • 設定與使用

例外狀況

問題 : 控制器內的 Try ~ Catch 到底是捕捉那些已知的例外還是未知的例外 ?

預期的例外異常 : 通常不需要捕捉所有的異常,因為 Middleware/Filter 已經能夠捕捉大部分情況,不須再花時間去單獨寫,只是有些情況下你可能需要在方法中捕捉特定的已知異常,這些異常是可以預期並且可以處理的,才會需要自己獨立寫 Try ~ Catch

非預期的異常:對於那些無法預期的異常,應該讓中介來處理。這樣可以確保應用程式不會因為未處理的異常而崩潰,並且可以統一返回錯誤信息

答案 : 會在控制器方法內寫 Try ~ Catch,應該是在捕捉預期的例外異常

設定與使用

可以把例外訊息拋到某一特定頁面,給開發人員快速查看,不然通常在正式環境上,發生例外錯誤,就是查看 log 紀錄,以 MVC 為例,如果有一個專屬頁面(供開發人員查看)搭配也是一個方式

1. 使用預設中介 :當應用程式中發生未處理的異常時,這個中介會捕捉到異常並將請求重定向到指定的錯誤處理頁面,如下範例,指向到 /Home/Error

app.UseExceptionHandler("/Home/Error");

UseExceptionHandler() : 為設置全域異常處理的中介,它可以捕捉應用程式中未處理的異常,並將請求重定向到指定的錯誤處理路徑
這樣可以統一處理異常,並返回友好的錯誤頁面或錯誤信息給用戶

2. 創建錯誤處理頁面

public class HomeController : Controller
{
    public IActionResult Error()
    {
        var exceptionDetails = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
        ViewBag.ExceptionPath = exceptionDetails?.Path;
        ViewBag.ExceptionMessage = exceptionDetails?.Error.Message;
        ViewBag.StackTrace = exceptionDetails?.Error.StackTrace;
        return View();
    }
}
@model ErrorViewModel
@{
    ViewData["Title"] = "Error";
}

<h1 class="text-danger">Error</h1>
<h2 class="text-danger">An error occurred while processing your request.</h2>

<div>
    <h3>Exception Details:</h3>
    <p>Path: @ViewBag.ExceptionPath</p>
    <p>Message: @ViewBag.ExceptionMessage</p>
    <p>Stack Trace: @ViewBag.StackTrace</p>
</div>
public class CustomerAccountController() : Controller
{
    public IActionResult Login()
    {
        throw new Exception("Test exception");
    }
}

https://ithelp.ithome.com.tw/upload/images/20241007/201339542Nepz4ybt9.png

也可以自訂義中介捕捉例外加上寫 Log 紀錄對照,回傳友善訊息給頁面,如下範例
https://ithelp.ithome.com.tw/upload/images/20241007/20133954dQ1oraVTVT.png

今日結語

  1. 在方法內完全不用刻意寫 try catch ,利用 Middleware 幫我們做這些整個應用程式的捕捉異常事情,如 app.UseExceptionHandler(”....”),不要花時間做這件事情

  2. 如果需求是不允許中斷需求時,我們才需要在方法內寫 try catch,這種情況通常意謂發生的例外是可以被預判的,所以通常會去捕捉可以預期的例外而不是非預期的例外

參考文章

https://learn.microsoft.com/zh-tw/aspnet/core/fundamentals/error-handling?view=aspnetcore-8.0

https://learn.microsoft.com/en-us/aspnet/core/fundamentals/error-handling?view=aspnetcore-8.0


上一篇
Day 23 CORS : 跨域資源共享
下一篇
Day 25 ASP .NET Core MVC
系列文
靠近 ASP .NET Core 一點點27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言